/*
 * 备忘录模式的起源来自于撤销的基本操作。有过word软件操作经验的朋友，应该基本上都使用过撤销的功能。
 *
 * 举个例子，假设你不小心删除了好几个段落的文字，这时候你应该怎么办呢？
 *
 * 其实要做的很简单，单击一些【撤销】就可以全部搞定了。撤销按钮给我们提供了一次反悔的机会。
 *
 * 既然是撤销，那么我们在进行某种动作的时候，就应该创建一个相应的撤销操作？
 *
 * 这个撤销操作的相关定义可以是这样的。
 */

typedef struct action
{
	int type;
	struct action * next;

	void * pdata;
	void (*process)(void * pdata);
}action;

/*
 * 数据结构中定义了两个部分：撤销的数据、恢复的操作。
 *
 * 那么这个撤销函数应该有一个创建的函数，还有一个恢复的函数。所以，作为撤销动作的管理者应该包括
 */
typedef struct organizer
{
	int number;
	action * paction_head;

	action * (*create)();
	void (*restore)(struct organizer * porganizer);
}organizer;

/*
 * 既然数据在创建和修改的过程中都会有相应的恢复操作，那么要是真正恢复原来的数据也就变得非常简单了
 */
void restore(struct organizer * porganizer)
{
	action * phead;
	assert(NULL != porganizer);

	phead = porganizer->paction_head;
	phead->process(phead->pdata);
	porganizer->paction_head = phead->next;
	proganizer->number--;
	free(phead);
}
